-- 存储过程
-- 封装在服务器上一段sql片段，已经编译好了的代码，客户端调存储过程，执行效率就会非常高效。

CREATE OR REPLACE PROCEDURE 存储过程名(param1 in type,param2 out type)
　IS
　变量1 类型(值范围);
　变量2 类型(值范围);　　
　BEGIN
　　　select count(*) into 变量1 from 表名 where 列名=param1;
　　　if (判断条件) then
　　　　　select 列名 into 变量2 from 表名 where 列名=param1;
　　　　　DBMS_OUTPUT.put_line('打印信息');
　　　Elsif (判断条件) then
　　　　　dbms_output.put_line('打印信息');
　　　Else
　　　　　Raise 异常名 (NO_DATA_FOUND);
　　　End if;
　Exception
　　　　　When others then
　　　　　　　Rollback; 　　
　END;

--存储函数
-- 封装在oracle在服务器里面的plsql片段，它是已经编译好的代码片段。

create [for replace] function 存储函数的名称(参数名 in|out 参数类型,参数名 in|out 参数类型）
return 参数类型
is | as
begin
end;


-- DEMO 重新生成有关联关系的三张表的主键
--1.给三张表都新建对应的临时表，临时表中增加new_id字段，用于保存新生成的ID
--2.分别将数据复制到临时表
--insert into temp_table(XX,XX,XX,XX) select XX, XX, XX, XX from table_name
--3.调用存储过程，给临时表的new_id赋值
--call P_UPDATE_DICTIONARY_KEY()
--4.将临时表中更新后的数据，重新复制到原表中
create or replace PROCEDURE P_UPDATE_DICTIONARY_KEY
AS
    categoryId number;
    categoryIdNew number;
    tagId number;
    tagIdNew number;
    itemId number;
    itemIdNew number;
BEGIN
     for dic_category in (select * from BASE_DICTIONARY_CATEGORY_TEMP) loop
         --存储父表ID
         categoryId := dic_category.id;
         select S_BASE_DICTIONARY_CATEGORY.nextval into categoryIdNew from dual;
         --存储子表ID
         for dic_tag in (select * from BASE_DICTIONARY_TAG_TEMP where category_id = categoryId and new_id is null) loop
            tagId := dic_tag.id;
            select S_BASE_DICTIONARY_TAG.nextval into tagIdNew from dual;
            --存储子子表ID
            for item in (select * from BASE_DICTIONARY_TAG_ITEM_TEMP where tag_id = tagId and new_id is null) loop
                itemId := item.id;
                --更新子子表ID
                select S_BASE_DICTIONARY_TAG_ITEM.nextval into itemIdNew from dual;
                update BASE_DICTIONARY_TAG_ITEM_TEMP set new_id = itemIdNew, tag_id = tagIdNew, category_id = categoryIdNew  where id = itemId;
            end loop;
            --更新子表ID
            update BASE_DICTIONARY_TAG_TEMP set new_id = tagIdNew, category_id = categoryIdNew  where id = tagId;
         end loop;
           --更新父表ID
         update BASE_DICTIONARY_CATEGORY_TEMP set new_id = categoryIdNew where id = categoryId;
      end loop;
END P_UPDATE_DICTIONARY_KEY;

